// douban 250 电影 https://movie.douban.com/top250
// npm包？  http是内置库  https无法thenable 
// fetch node端有bug
// superagent   node低版本 不支持 import

import superagent from 'superagent' ; // es6 js库  @types/ 常用的js库添加类型声明文件
import cheerio from 'cheerio';
import fs from 'fs';
import path from 'path';
import { insertBefore } from 'cheerio/lib/api/manipulation';

interface Info{
    title:string;
    url:string;
    pic:string;
}

interface InfoResult{
    time:number;
    data:Info[];
}

interface objJson{
    [propName:number]:Info[]
}

class Crawler{
    // es6 class property  babel es6 class
    private url='https://movie.douban.com/top250';
    constructor(){
        this.initSpiderProcess();
    }
    async initSpiderProcess(){  // 名字  爬虫初始化
        const {text:html} = await this.getRawHtml();
        // console.log(html.text);
        const info = await this.getJsonInfo(html);
        this.getJsonContent(info);
    }
    async getRawHtml(){
        // 请求
        // getJsonInfo 解析
        const result = await superagent.get(this.url);
        return result;
    }
    // 解析
    getJsonInfo(html:string){
        // python 正则 百度
        // js cheerio html string -> 内存 虚拟DOM
        const $=cheerio.load(html); // html load 进内存构建虚拟dom树
        // ol 有序列表 ul 无序列表
        const movies=$(".grid_view .item");
        // console.log(movies);

        let info:Info[]=[];

        for(let i=0;i<movies.length;i++){
            let movie=movies[i];
            let pic:string = $(movie).find('.pic img').attr('src') || '';
            let title:string=$(movie).find('.info .title:first-child').text();
            let url:string=$(movie).find('.info a').attr('href') || '';
            info.push({
                title,
                pic,
                url
            })
        }
        const result={
            time:new Date().getTime(),
            data:info
        }
        return result;
    }
    async getJsonContent(info:InfoResult){
        // fs  json拼接成字符串  resolve链接并解析为路径
        const filePath = path.resolve(__dirname,'./data/url.json');
        let fileContent:objJson={};
        // 安全校验？
        if(fs.existsSync(filePath)){
            // buffer 读文件返回类型
            fileContent=await JSON.parse(fs.readFileSync(filePath,'utf-8'));
        }
        console.log(fileContent);
        fileContent[info.time]=info.data;
        fs.writeFileSync(filePath,JSON.stringify(fileContent));
        
    }
}
const crawler =new Crawler();